home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 43 / Amiga Format CD43 (1999)(Future Publishing)(GB)(Track 1 of 2)[!][issue 1999-09].iso / -serious- / programming / c / amiga-c / files / display.cpp < prev    next >
C/C++ Source or Header  |  1999-06-14  |  6KB  |  246 lines

  1. /**************************************************************************
  2.  
  3. Name       : Display.cpp
  4. Programmer : Jesse Chan
  5. Version    : 0.01
  6. Date Begun : 03-24-1999
  7. Date Last  : 04-12-1999
  8. Description: Display member functions
  9.  
  10. Completed  : - Opens a Multiscan:Productivity 640x480 custom screen!
  11.              - Created an 8-color palette to go with it
  12.              - Added a clear screen function using BltClear
  13.  
  14. To do list : - Add Double Buffering....
  15.  
  16. **************************************************************************/
  17.  
  18. // INCLUDES ///////////////////////////////////////////////////////////////
  19.  
  20. #include <proto/exec.h> // OpenLibrary, CloseLibrary
  21. #include <proto/graphics.h>
  22. #include <proto/intuition.h>
  23.  
  24. #include <exec/memory.h>
  25. #include <exec/types.h>
  26. #include <graphics/gfxbase.h>
  27. #include <intuition/intuition.h>
  28.  
  29. #include <iostream.h>
  30. #include <math.h>
  31. #include <string.h>
  32.  
  33. #include "Display.h"
  34. #include "Keys.h"
  35.  
  36. // STRUCTS ////////////////////////////////////////////////////////////////
  37.  
  38. struct IntuitionBase *IntuitionBase = NULL;
  39. struct GfxBase *GfxBase = NULL;
  40.  
  41. struct RastPort *myrastport = NULL;
  42. struct Screen   *myscreen = NULL;
  43. struct Window   *mywindow = NULL;
  44.  
  45. //struct ScreenBuffer *sbuffer[2] = { NULL };
  46.  
  47. // FUNCTIONS //////////////////////////////////////////////////////////////
  48.  
  49. Display::Display()
  50. {
  51.    x = WIDTH/2;
  52.    y = HEIGHT/2;
  53.    color = 1;
  54. //visible_buffer = 0;
  55.  
  56.    colortable[0] = 0x007; // Dark Blue
  57.    colortable[1] = 0xFFF; // White
  58.    colortable[2] = 0x999; // Gray
  59.    colortable[3] = 0xF00; // Red
  60.    colortable[4] = 0xFF0; // Yellow
  61.    colortable[5] = 0x083; // Light Green
  62.    colortable[6] = 0x0BB; // Blue-Green
  63.    colortable[7] = 0x73F;  // Medium Blue
  64.  
  65.    OpenDisplay();
  66.  
  67. } // End Constructor
  68.  
  69. ///////////////////////////////////////////////////////////////////////////
  70.  
  71. Display::~Display()
  72. {
  73.    CloseDisplay();
  74.  
  75. } // End Destructor
  76.  
  77. ///////////////////////////////////////////////////////////////////////////
  78.  
  79. void Display::OpenDisplay(void)
  80. {
  81.    if(!(IntuitionBase = (struct IntuitionBase *)
  82.       OpenLibrary( (unsigned char *)"intuition.library",0)))
  83.    {
  84.       cerr << "Could not open Intuition.library!" << endl;
  85.    }
  86.  
  87.    if(!(GfxBase = (struct GfxBase *)
  88.       OpenLibrary( (unsigned char *)"graphics.library",0)))
  89.    {
  90.       cerr << "Could not open Graphics.library!" << endl;
  91.    }
  92.  
  93.    myscreen = OpenScreenTags( NULL,
  94.                                 SA_DisplayID, VGAPRODUCT_KEY,
  95.                                 SA_Width, WIDTH,
  96.                                 SA_Height, HEIGHT,
  97.                                 SA_Depth, DEPTH,
  98.                                 SA_ShowTitle, FALSE,
  99.                                 SA_Title, (char *)"GFX",
  100.                                 SA_SysFont, NULL,
  101.                                 SA_Type, CUSTOMSCREEN,
  102.                                 SA_Quiet, TRUE,
  103.                                 TAG_END );
  104.    // Good to clear everything in random memory
  105.    ClearDisplay();
  106.  
  107.    mywindow = OpenWindowTags( NULL,
  108.                                 WA_Width, WIDTH,
  109.                                 WA_Height, HEIGHT,
  110.                                 WA_Title, FALSE,
  111.                                 WA_Backdrop, TRUE,
  112.                                 WA_Borderless, TRUE,
  113.                                 WA_Gadgets, FALSE,
  114.                                 WA_Activate, TRUE,
  115.                                 WA_SimpleRefresh, TRUE,
  116.                                 WA_RMBTrap, TRUE,
  117.                                 WA_CustomScreen, myscreen,
  118.                                 WA_IDCMP,
  119.                                 IDCMP_RAWKEY,
  120.                                 TAG_END );
  121.  
  122.   myrastport = mywindow->RPort;
  123.  
  124.   // Open palette old style, LoadRGB4
  125.   // use LoadRGB32 for AGA palettes
  126.   LoadRGB4(&myscreen->ViewPort, colortable, pow2(DEPTH) );
  127. //sbuffer[0] = AllocScreenBuffer(myscreen, NULL, SB_SCREEN_BITMAP);
  128. //sbuffer[1] = AllocScreenBuffer(myscreen, NULL, SB_COPY_BITMAP);
  129.  
  130. } // End OpenDisplay
  131.  
  132. ///////////////////////////////////////////////////////////////////////////
  133.  
  134. void Display::CloseDisplay(void)
  135. {
  136. //FreeScreenBuffer(myscreen, sbuffer[1]);
  137. //FreeScreenBuffer(myscreen, sbuffer[0]);
  138.  
  139.    if(mywindow)
  140.       CloseWindow(mywindow);
  141.    if(myscreen)
  142.       CloseScreen(myscreen);
  143.    if(GfxBase)
  144.       CloseLibrary( (struct Library *)GfxBase );
  145.    if(IntuitionBase)
  146.       CloseLibrary( (struct Library *)IntuitionBase );
  147.  
  148. } // End CloseDisplay
  149.  
  150. ///////////////////////////////////////////////////////////////////////////
  151.  
  152. void Display::ClearDisplay(void)
  153. {
  154.   // Clear screen with blitter
  155.   for (int i = 0; i < DEPTH; i++)
  156.   {
  157.      BltClear( (&myscreen->RastPort)->BitMap->Planes[i], (myscreen->Width/8)*myscreen->Height, 0L );
  158.   }
  159.  
  160. } // End ClearDisplay
  161.  
  162. ///////////////////////////////////////////////////////////////////////////
  163.  
  164. void Display::Compile_Title(char* string, char* date, char* time)
  165. {
  166.    SetDrMd(myrastport, JAM1);
  167.    SetAPen(myrastport, 1);
  168.  
  169.    Move(myrastport, 10, 10);
  170.    Text(myrastport, string, strlen(string));
  171.    Move(myrastport, 10, 30);
  172.    Text(myrastport, date, strlen(date));
  173.    Move(myrastport, 10, 40);
  174.    Text(myrastport, time, strlen(time));
  175.  
  176. } // End Compile_Title
  177.  
  178. ///////////////////////////////////////////////////////////////////////////
  179.  
  180. void Display::Worms(void)
  181. {
  182.    SetDrMd(myrastport, JAM1);
  183.  
  184.    SetAPen(myrastport, 0);
  185.    Move(myrastport, WIDTH/2, HEIGHT/2);
  186.    Draw(myrastport, x, y);
  187.  
  188.    switch(keypressed)
  189.    {
  190.       case KEY_CURS_UP:
  191.          y--;
  192.       break;
  193.  
  194.       case KEY_CURS_DOWN:
  195.          y++;
  196.       break;
  197.  
  198.       case KEY_CURS_LEFT:
  199.          x--;
  200.       break;
  201.  
  202.       case KEY_CURS_RIGHT:
  203.          x++;
  204.       break;
  205.    }
  206.  
  207.    // Clipping boundaries
  208.    if(x < 0)
  209.       x = 0;
  210.    if(x > WIDTH-1)
  211.       x = WIDTH-1;
  212.    if(y < 0)
  213.       y = 0;
  214.    if(y > HEIGHT-1)
  215.       y = HEIGHT-1;
  216.  
  217.    SetAPen(myrastport, color);
  218.    Move(myrastport, WIDTH/2, HEIGHT/2);
  219.    Draw(myrastport, x, y);
  220.  
  221. //visible_buffer^=1;
  222. //ChangeScreenBuffer(myscreen, sbuffer[visible_buffer]);
  223. WaitTOF();
  224.  
  225. } // End Worms
  226.  
  227. ///////////////////////////////////////////////////////////////////////////
  228.  
  229. void Display::KeyUpdate(void)
  230. {
  231.    struct IntuiMessage *msg;
  232.  
  233.    // loop where to handle all messages
  234.    while(msg = (struct IntuiMessage *)GetMsg(mywindow->UserPort))
  235.    {
  236.       keypressed  = msg->Code;
  237.       ReplyMsg((struct Message *)msg); // reply to message
  238.    }
  239.  
  240. } // End KeyUpdate
  241.  
  242. ///////////////////////////////////////////////////////////////////////////
  243.  
  244.  
  245.  
  246.